package com.chang.cart.controller;

import com.chang.cart.service.CartService;
import com.chang.cart.vo.CartItemVo;
import com.chang.cart.vo.CartVo;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.mvc.support.RedirectAttributes;

import java.util.List;

/**
 * @author: changzhenxi
 * @date: 2024年12月16日 15:05
 * @Version: 1.0
 * @description: 这里的逻辑是购物车分为两类，一类是未登录时的临时购物车，一类是登录后的购物车，登录后需要把两个购物车合并到一起
 */
@Slf4j
@Controller
public class CartController {

    @Resource
    CartService cartService;

    // 有弹幕说这里可以完善一下，验证session的同事去数据库查一下是否有这个用户，不然可以在session中虚构用户

    // 京东当时的购物车逻辑时cookie中用一个user-key标识用户，一个月之后过期  未登录时第一次使用购物车功能都会给一个临时的用户身份
    // 浏览器保存，每次访问都会带上这个user-key

    // 如果登录了，那么session中就会有购物车信息  这里的验证放到拦截器中实现
    //
    @GetMapping("cart.html")
    public String cartListPage(Model model) {
        // 获取用户信息
        // UserInfoTo userInfoTo = CartInterceptor.memberThreadLocal.get();
        CartVo cart = cartService.getCart();
        model.addAttribute("cart", cart);
        return "cartList";
    }

    // 添加商品到购物车 需要确定是哪件商品，添几件
    // 另外这里如果刷新之后就会携带参数重复提交请求，导致刷新一次购物车的数量就会增加
    // 所以这里的逻辑就是将添加请求与展示效果分离，先添加购物车，然后重定向到一个新的页面，新页面只负责展示(如果是前后端分离的话弹幕说可以搞成单击事件添加,然后同样只展示即可)
    @GetMapping("addToCart")
    public String addToCartPage(@RequestParam("skuId") Long skuId, @RequestParam("num") Integer num, RedirectAttributes attributes) {
        cartService.addToCart(skuId, num);
        // 重定向的话就不能携带model数据了.
        // model.addAttribute("items", cartItemVo);
        // 需要使用RedirectAttributes  重定向之后，在url后面拼接参数
        attributes.addAttribute("skuId", skuId);
        return "redirect:http://cart.gulimall.com/addToCartSuccess.html";
    }

    @GetMapping("addToCartSuccess.html")
    public String addToCartSuccessPage(@RequestParam("skuId") Long skuId, Model model) {
        // 重定向到成功页面，再次查询购物车数据
        log.info("重定向成功skuId = " + skuId);
        CartItemVo cartItemVo = cartService.getCartItem(skuId);
        model.addAttribute("item", cartItemVo);
        return "success";
    }

    // 这里关于购物车商品的选中我用脚趾头都知道应该前端来做,然后只将选中的商品封装之后发送请求,不然后端请求的门槛太低了,如果有人手贱连续点击选中框,后端还得一直请求redis?
    @GetMapping("checkItem")
    public String checkItem(@RequestParam("skuId") Long skuId,
                            @RequestParam("checked") Integer checked) {
        cartService.checkItem(skuId, checked);
        return "redirect:http://cart.gulimall.com/cart.html";
    }

    @GetMapping("countItem")
    public String itemCount(@RequestParam("skuId") Long skuId,
                            @RequestParam("num") Integer num) {
        cartService.changeItemCount(skuId, num);
        return "redirect:http://cart.gulimall.com/cart.html";
    }

    @GetMapping("deleteItem")
    public String deleteItem(@RequestParam("skuId") Long skuId) {
        cartService.deleteItem(skuId);
        return "redirect:http://cart.gulimall.com/cart.html";
    }

    // 获取当前用户的所有购物项 远程调用
    @ResponseBody
    @GetMapping("/currentUserCartItems")
    public List<CartItemVo> currentUserCartItems() {
        return cartService.getUserCartItems();
    }
}
